/**
 * 
 */
package fr.toussna.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.RowMapper;

import fr.toussna.entity.Category;
import fr.toussna.entity.DomainEntity;

/**
 * Cette classe est une spécialisation de la classe {@link AbstractDAO}, elle
 * implémente toutes les méthodes abstraites de la classe mère. Elle spécifie les
 * requêtes Sql pour l'entité {@link Category} et rajoutes des méthodes adaptées
 * à la classe Category.
 * 
 * C'est dans cette classe qu'on implémente les algorithmes pour compléter le
 * design pattern Template. On utilise le {@link RowMapper} de Spring JDBC pour
 * simplifier le Mapping objet relationnel.
 * 
 * @author My
 * @version 2.0
 * 
 */
public class CategoryDAO extends AbstractDAO {

	private static final Log	LOGGER	= LogFactory.getLog(CategoryDAO.class
	                                            .getName());

	// **********************************
	// * Attributs *
	// **********************************
	/**
	 * Nom de la table dans la base
	 */
	private static final String	TABLE	= "CATEGORY";

	/**
	 * Colonne de la table dans la base
	 */
	private static final String	COLUMNS	= "NAME";

	// **********************************
	// * Methodes heritees *
	// **********************************

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getSelectSqlStatement()
	 */
	@Override
	protected String getSelectSqlStatement() {
		String sql = "SELECT * FROM " + TABLE + " WHERE ID= ? ";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getInsertSqlStatement()
	 */
	@Override
	protected String getInsertSqlStatement() {
		String sql = "INSERT INTO " + TABLE + " (" + COLUMNS + ") VALUES (?)";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getUpdateSqlStatement()
	 */
	@Override
	protected String getUpdateSqlStatement() {
		String sql = "UPDATE " + TABLE + " SET NAME= ? WHERE ID= ?";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getDeleteSqlStatement()
	 */
	@Override
	protected String getDeleteSqlStatement() {
		String sql = "DELETE FROM " + TABLE + " WHERE ID= ?";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getSelectAllSqlStatement()
	 */
	@Override
	protected String getSelectAllSqlStatement() {
		String sql = "SELECT * FROM " + TABLE;
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getSelectByKeySqlStatement()
	 */
	@Override
	protected String getSelectByKeySqlStatement(String key) {
		String sql = "SELECT * FROM " + TABLE
		        + " WHERE NAME LIKE '%"+key+"%' ";
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.toussna.dao.AbstractDAO#getDomainEntityRowMapper()
	 */
	@Override
	protected RowMapper<DomainEntity> getDomainEntityRowMapper() {
		return new RowMapper<DomainEntity>() {

			@Override
			public Category mapRow(ResultSet rs, int rowNum)
			        throws SQLException {
				Category category = new Category();
				// NAME
				category.setId(rs.getLong("id"));
				category.setName(rs.getString("name"));
				if (LOGGER.isDebugEnabled()) {
					LOGGER.debug("Mapped data to entity: "
					        + category.toString());
				}
				return category;
			}
		};
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.toussna.dao.AbstractDAO#getDomainEntityData(fr.toussna.entity.DomainEntity
	 * )
	 */
	@Override
	protected Object[] getDomainEntityData(DomainEntity entity) {
		Category category = (Category) entity;
		if (category.getId() > 0) {
			Object[] obj = new Object[] { category.getName(), category.getId() };
			if (LOGGER.isDebugEnabled()) {
				LOGGER.debug("Mapped entity to row data: "
				        + Arrays.toString(obj));
			}
			return obj;
		} else {
			Object[] obj = new Object[] { category.getName() };
			if (LOGGER.isDebugEnabled()) {
				LOGGER.debug("Mapped entity to row data: "
				        + Arrays.toString(obj));
			}
			return obj;
		}
	}

}
